/*
题目描述
Ural 大学有 N 名职员，编号为 1～N。他们的关系构成一棵以校长为根的树，父节点是子节点的直接上司。每个职员有一个快乐指数 Hi（1 ≤ i ≤ N）。
现在要举办一场宴会，但没有职员愿意和直接上司一起参会。在满足该条件的前提下，主办方希望邀请部分职员参会，使得参会职员的快乐指数总和最大。求这个最大值。

输入格式
第一行：整数 N（职员数量）
接下来 N 行：第 i 行表示职员 i 的快乐指数 Hi
接下来 N-1 行：每行两个整数 L, K，表示 K 是 L 的直接上司（注意输入顺序：后一个数是前一个数的父节点）
输出格式
输出一个整数，表示快乐指数的最大和。

数据范围
1 ≤ N ≤ 6000
-128 ≤ Hi ≤ 127

输入样例：
7
1
1
1
1
1
1
1
1 3
2 3
6 4
7 4
4 5
3 5

输出样例：
5
 */

import java.util.*;

public class Main {
    static int n;
    static int[] h = new int[6001];
    static ArrayList<ArrayList<Integer>> graph = new ArrayList<>();
    static boolean[] hasParent = new boolean[6001];
    static int[][] dp = new int[6001][2];

    static void dfs(int u) {
        for (int v : graph.get(u)) {
            dfs(v);
            dp[u][1] += dp[v][0];
            dp[u][0] += Math.max(dp[v][0], dp[v][1]);
        }
        dp[u][1] += h[u];
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        for (int i = 0; i <= n; i++) {
            graph.add(new ArrayList<>());
        }
        for (int i = 1; i <= n; i++) {
            h[i] = sc.nextInt();
        }
        for (int i = 1; i < n; i++) {
            int l = sc.nextInt();
            int k = sc.nextInt();
            hasParent[l] = true;
            graph.get(k).add(l);
        }
        int root = 0;
        for (int i = 1; i <= n; i++) {
            if (!hasParent[i]) {
                root = i;
                break;
            }
        }
        dfs(root);
        System.out.println(Math.max(dp[root][0], dp[root][1]));
    }
}